package org.jeecg.modules.oms.service;

import org.jeecg.modules.oms.vo.CustomerStatisticsVO;
import org.jeecg.modules.oms.vo.SalesOverviewVO;

import java.util.List;

/**
 * @Description: OMS销售统计服务接口
 * @Author: jeecg-boot
 * @Date: 2025-01-13
 * @Version: V1.0
 */
public interface IOmsStatisticsService {

    /**
     * 获取销售概览统计数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @return 销售概览统计数据
     */
    SalesOverviewVO getSalesOverview(String startDate, String endDate);

    /**
     * 获取销售趋势数据
     *
     * @param period 统计周期 (day/week/month/year)
     * @param limit  返回数据条数
     * @return 销售趋势数据
     */
    List<SalesOverviewVO.SalesTrendItem> getSalesTrend(String period, Integer limit);

    /**
     * 获取订单状态分布统计
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 订单状态分布数据
     */
    List<SalesOverviewVO.OrderStatusItem> getOrderStatusDistribution(String startDate, String endDate);

    /**
     * 获取客户概览统计数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @return 客户概览统计数据
     */
    CustomerStatisticsVO.CustomerOverviewVO getCustomerOverview(String startDate, String endDate);

    /**
     * 获取客户销售金额排行榜
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param limit     返回数据条数
     * @return 客户销售金额排行榜
     */
    List<CustomerStatisticsVO.CustomerRankingItem> getCustomerSalesRanking(String startDate, String endDate, Integer limit);

    /**
     * 获取客户订单数量排行榜
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param limit     返回数据条数
     * @return 客户订单数量排行榜
     */
    List<CustomerStatisticsVO.CustomerRankingItem> getCustomerOrderRanking(String startDate, String endDate, Integer limit);

    /**
     * 获取客户贡献度分析数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param type      分析类型 (sales/orders)
     * @return 客户贡献度分析数据
     */
    CustomerStatisticsVO.CustomerContributionVO getCustomerContribution(String startDate, String endDate, String type);

    /**
     * 获取新老客户分析数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param type      分析类型 (count/sales)
     * @return 新老客户分析数据
     */
    CustomerStatisticsVO.CustomerAnalysisVO getCustomerAnalysis(String startDate, String endDate, String type);

    // ==================== 产品销售分析相关方法 ====================

    /**
     * 获取产品销售概览统计数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @return 产品销售概览统计数据
     */
    Object getProductOverview(String startDate, String endDate);

    /**
     * 获取产品系列销售排行榜
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param limit     返回数据条数
     * @return 产品系列销售排行榜
     */
    Object getProductSeriesRanking(String startDate, String endDate, Integer limit);

    /**
     * 获取产品颜色销售分析数据
     *
     * @param startDate  开始日期 (格式: yyyy-MM-dd)
     * @param endDate    结束日期 (格式: yyyy-MM-dd)
     * @param seriesName 产品系列筛选
     * @return 产品颜色销售分析数据
     */
    Object getProductColorAnalysis(String startDate, String endDate, String seriesName);

    /**
     * 获取客户区域销售分析数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param level     区域级别 (province/city/district)
     * @return 客户区域销售分析数据
     */
    Object getProductRegionAnalysis(String startDate, String endDate, String level);

    /**
     * 获取产品销售趋势分析数据
     *
     * @param period    统计周期 (day/week/month/year)
     * @param limit     返回数据点数量
     * @param dimension 分析维度 (sales/orders/quantity)
     * @return 产品销售趋势分析数据
     */
    Object getProductTrend(String period, Integer limit, String dimension);

    /**
     * 获取产品销售分布图表数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param type      分布类型 (series/color/region)
     * @return 产品销售分布图表数据
     */
    Object getProductDistribution(String startDate, String endDate, String type);

    // ==================== 区域销售分析相关方法 ====================

    /**
     * 获取区域销售概览统计数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param level     区域级别 (province/city/area)
     * @return 区域销售概览统计数据
     */
    Object getRegionOverview(String startDate, String endDate, String level);

    /**
     * 获取区域销售分布数据
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param level     区域级别 (province/city/area)
     * @param dataType  数据类型 (sales/orders/customers)
     * @return 区域销售分布数据
     */
    Object getRegionDistribution(String startDate, String endDate, String level, String dataType);

    /**
     * 获取区域销售排行榜
     *
     * @param startDate 开始日期 (格式: yyyy-MM-dd)
     * @param endDate   结束日期 (格式: yyyy-MM-dd)
     * @param level     区域级别 (province/city/area)
     * @param limit     返回数据条数
     * @return 区域销售排行榜
     */
    Object getRegionRanking(String startDate, String endDate, String level, Integer limit);

    /**
     * 获取区域增长率对比数据
     *
     * @param period 统计周期 (month/quarter/year)
     * @param level  区域级别 (province/city/area)
     * @param limit  返回数据条数
     * @return 区域增长率对比数据
     */
    Object getRegionGrowth(String period, String level, Integer limit);

    /**
     * 获取区域销售趋势数据
     *
     * @param period 统计周期 (month/quarter/year)
     * @param level  区域级别 (province/city/area)
     * @param limit  返回数据点数量
     * @return 区域销售趋势数据
     */
    Object getRegionTrend(String period, String level, Integer limit);
}
